home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 8
/
FM Towns Free Software Collection 8.iso
/
t_os
/
diskdup
/
diskdup.c
< prev
next >
Wrap
Text File
|
1994-06-01
|
25KB
|
1,033 lines
/********************************************************************
* *
* DISKDUP *
* *
* オンメモリ型 DISKCOPY *
* *
* diskdup.exp *
* *
* for FM-TOWNS *
* *
* Copyright (c) ちにゃと & Tymic 1992. 1993. *
* *
* メイン ソース *
* *
********************************************************************/
#define __PRGMAIN__ /* ファイル ID */
/********************************************************************
インクルードファイル
*********************************************************************/
/* HI-C ライブラリ ヘッダー */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <dos.h>
/* T-BIOS C ライブラリ ヘッダー */
#include <fmcfrb.h>
/* ソース ヘッダー */
#include "diskdup.h"
#include "ddupgui.h"
#include "option.h"
/********************************************************************
変数
*********************************************************************/
char Title1[] = "DiskDup Ver "VER;
char Title2[] = "Copyright (C) ちにゃと&TYMIC 1992.1993.";
static char *HelpMsg[] = {
"パラメ-タ-は先頭に - か / をつけます",
"大文字でも小文字でも構いません",
"-S -s 読み込んだディスクの内容のデ-タファイルを作成します",
"-L -l デ-タファイルを読み込んでデュプリケ-トをします",
"-F -f フォ-マットを行いながらデュプリケ-トします",
"-D -d フォ-マットをせずにデュプリケ-トします",
"-I -i エラ-時以外に選択/確認を行いません",
"-H -h -? ヘルプメッセ-ジを表示します",
"ファイル名 デ-タファイル名を指定します ドライブ名パス名も含みます",
"例1 -F -I フォ-マットをします。又選択/確認を行いません",
"例2 -S MAOUDX_A.DSK",
" デ-タファイルを指定されたファイル名で作成します",
};
#define HELPMSG_MAX sizeof( HelpMsg ) / sizeof( char* )
static char InMstAMsg[] = "マスターディスクをAドライブにセットして下さい";
static char InCpyAMsg[] = "コピーディスクをAドライブにセットして下さい";
static char InCpyBMsg[] = "コピーディスクをBドライブにセットして下さい";
static char FormProcMsg[] = "フォーマットをしながらコピーを行います";
static char EndMsg[] = "終了します";
char *ErrMsgTbl[] = { /* エラー メッセージ テーブル */
"",
"モード設定エラーが発生しました",
"読み込みエラーが発生しました",
"書き込みエラーが発生しました",
"ドライブエラーが発生しました",
"未対応のディスクです",
"ドライブの準備が出来ていません",
"書き込み禁止のためコピー出来ません",
"フォーマットでエラーが発生しました",
};
static char *DiskTypeMsgTbl[] = { /* ディスク タイプ メッセージ テーブル */
"",
"1・2M 2HD 読み込み中",
"720k 2DD 読み込み中",
"640k 2DD 読み込み中",
"1・2M 2HC 読み込み中",
};
static uint ChkMode1Tbl[] = { /* セクタ ID 読み込み用 mode1 データ テーブル */
0x0003, /* MFM 2HD 1024 */
0x0012, /* MFM 2DD 512 */
0x0080, /* FM 2HD 128 */
0x0090, /* FM 2DD 128 */
};
#define ChkMode1Tbl_Size sizeof( ChkMode1Tbl ) / sizeof( uint )
static FORMPARA PreAmbl[] = { /* プレ アンブル 圧縮 データ */
0x004e, 80, /* GAP0 */
0x0000, 12, /* SYNC */
0x00f6, 3, /* INDEX MARK 1 */
0x00fc, 1, /* INDEX MARK 2 */
0x004e, 50, /* GAP1 */
};
#define PreAmblCnt sizeof( PreAmbl ) / sizeof( FORMPARA )
static FORMPARA PosAmbl[] = { /* ポスト アンブル 圧縮 データ */
0x004e, 600, /* GAP4 */
};
#define PosAmblCnt sizeof( PosAmbl ) / sizeof( FORMPARA )
static FORMPARA SecData1024[] = { /* 1024 セクタ 圧縮 データ */
0x0000, 12, /* SYNC */
0x00f5, 3, /* AM1_1 */
0x00fe, 1, /* AM1_2 */
0x0000, 1, /* ID TRACK NUMBER */
0x0000, 1, /* ID SIDE NUMBER */
0x0000, 1, /* ID SECTOR NUMBER */
0x0003, 1, /* ID SECTOR LENGTH */
0x00f7, 1, /* CRC */
0x00fe, 1, /* CRC */
0x004e, 22, /* GAP2 */
0x0000, 12, /* SYNC */
0x00f5, 3, /* AM2_1 */
0x00fb, 1, /* AM2_2 */
0x00e5, 1024, /* DATA */
0x00f7, 1, /* CRC */
0x00fe, 1, /* CRC */
0x004e, 116, /* GAP3 */
};
#define SecData1024Cnt sizeof( SecData1024 ) / sizeof( FORMPARA )
static FORMPARA SecData512[] = { /* 512 セクタ 圧縮 データ */
0x0000, 12, /* SYNC */
0x00f5, 3, /* AM1_1 */
0x00fe, 1, /* AM1_2 */
0x0000, 1, /* ID TRACK NUMBER */
0x0000, 1, /* ID SIDE NUMBER */
0x0000, 1, /* ID SECTOR NUMBER */
0x0002, 1, /* ID SECTOR LENGTH */
0x00f7, 1, /* CRC */
0x00fe, 1, /* CRC */
0x004e, 22, /* GAP2 */
0x0000, 12, /* SYNC */
0x00f5, 3, /* AM2_1 */
0x00fb, 1, /* AM2_2 */
0x00e5, 512, /* DATA */
0x00f7, 1, /* CRC */
0x00fe, 1, /* CRC */
0x004e, 116, /* GAP3 */
};
static int FormatFlg = TRUE; /* フォーマット 実行 フラグ */
static char *DiskData; /* ディスク 読み込み バッファ ポインタ */
static char FormDataBuf[1024*12]; /* フォーマット データ バッファ */
static int disktype = 0; /* ディスク タイプ */
int option = 0; /* オプション データ */
/************************************************************************
【メイン処理】
概要 メイン 関数
用法 無し
引数 int argc
char **argv
戻り値 無し
注意 メモリ アロケート 後の プロセス 脱出は PrgExit1 関数を使用
************************************************************************/
void main( int argc, char *argv[] )
{
union REGS regs;
struct SREGS sregs;
int tmpi;
/* GUI 初期設定 及び タイトル 表示 */
setscreen();
putworkbox();
/* forRBIOS 常駐 チェック */
if ( FRB_getstatus() != 0 ) {
flagerr = 1;
strcpy( str, "forRBIOSが組み込まれていません" );
putmessage();
ready();
flagerr = 0;
PrgExit2();
}
/* 共用 メモリ 容量 チェック */
_segread( &sregs );
regs.x.ax = 0x250d;
_int86x( 0x21, ®s, ®s, &sregs );
if ( regs.x.cx < sizeof( FormDataBuf ) ) {
flagerr = 1;
strcpy( str, "ごめんなさいリアルメモリ不足です" );
putmessage();
ready();
flagerr = 0;
PrgExit2();
}
/* メモリ アロケ-ション */
if ( ( DiskData = (char *)malloc( DISKSIZE ) ) == NULL ) {
flagerr = 1;
strcpy( str, "ごめんなさいメモリ不足です" );
putmessage();
ready();
flagerr = 0;
PrgExit2();
}
/* オプション 解析 */
option = optionset( argc, argv );
if ( option == -1 ) {
flagerr = 1;
strcpy( str, "オプションが違います" );
putmessage();
ready();
option = -2;
}
if ( ( option & 3 ) == 3 ) {
flagerr = 1;
strcpy( str, "デ-タファイルの読み込みと作成が同時に指定されました" );
putmessage();
ready();
PrgExit1();
}
if ( option == -2 ) {
flagerr = 1;
for ( tmpi = 0; tmpi < HELPMSG_MAX; tmpi++ ) {
strcpy( str, HelpMsg[tmpi] );
putmessage();
ready();
}
PrgExit1();
}
/* debug *******************************
sprinf( str, "flagld = %d", flagld );
putmessage();
ready();
sprintf( str, "flagsv = %d", flagsv );
putmessage();
ready();
sprintf( str, "flaggofmt = %d", flaggofmt );
putmessage();
ready();
sprintf( str, "flagunfmt = %d", flagunfmt );
putmessage();
ready();
sprintf( str, "flagipt = %d", flagipt );
putmessage();
ready();
/***************************************/
/* コピー プログラム スタート */
CopyPrgMain();
/* 処理終了 */
PrgExit1();
}
/************************************************************************
【プログラム終了処理】
概要 プログラム を終了して DOS へ戻る。
用法 PrgExit?();
引数 無し
戻り値 無し
注意 メモリ アロケート ポインタ は DiskData を使用
************************************************************************/
void PrgExit1( void )
{
/* 2HD 1.2M モード に設定 */
SetDiskDrvMode( FD0_DRVNO, TYPE_2HD_12 );
SetDiskDrvMode( FD1_DRVNO, TYPE_2HD_12 );
/* メモリ 開放 */
free( DiskData );
PrgExit2();
}
void PrgExit2( void )
{
/* プロセス 脱出 */
exit( 0 );
}
/************************************************************************
【コピープログラムメイン処理】
概要 プロッピー ディスク の ディスク コピー を行う。
用法 CopyPrgMain();
引数 無し
戻り値 無し
注意 無し
************************************************************************/
void CopyPrgMain( void )
{
uint status; /* ドライブ ステータス */
int drvno; /* コピー 先 デバイス 番号 */
int i; /* 切り替え sw */
if ( option & 1 ) {
flagerr = 1;
strcpy( str, " デ-タファイルを読み込みんでデュプリします" );
putmessage();
flagerr = 0;
if ( select() == 1 ) {
flagerr = 1;
strcpy( str, EndMsg );
putmessage();
ready();
return;
}
disktype = loaddata( DiskData );
if ( ( disktype > TYPE_NOT ) && ( disktype < TYPE_END ) ) {
flagerr = 1;
strcpy( str, " デ-タファイルを読み込みました" );
putmessage();
flagerr = 0;
ready();
}
else {
flagerr = 1;
strcpy( str, " デ-タファイルを読み込み出来ませんでした" );
putmessage();
ready();
flagerr = 0;
strcpy( str, EndMsg );
putmessage();
ready();
return;
}
}
else {
for ( ;; ) {
/* ディスク セット メッセージ 表示 */
flagerr = 1;
strcpy( str, InMstAMsg );
putmessage();
if ( select() == 1 ) {
strcpy( str, EndMsg );
putmessage();
if ( select() == -1 ) {
return;
}
continue;
}
flagerr = 0;
/* ステータス 読み込み */
DKB_rdstatus( FD0_DRVNO, &status );
if ( status & 0x01 ) {
ErrMsgPutWord( ERRNOTDISK ); /* ドライブ ノット レディー */
continue;
}
/* フォーマット タイプ チェック */
disktype = ChkFormatType( FD0_DRVNO );
if ( disktype == NG ) {
ErrMsgPutWord( ERRDISKSET ); /* ディスク 設定 エラー */
continue;
}
if ( disktype == TYPE_NOT ) {
ErrMsgPutWord( ERRDISKTYPE ); /* 未対応 ディスク エラー */
continue;
}
/* モード 設定 */
if ( SetDiskDrvMode( FD0_DRVNO, disktype ) != 0 ) {
ErrMsgPutWord( ERRMODESET ); /* モード セット エラー */
continue;
}
/* フォーマット タイプ 表示 */
clrmessage();
flagerr = 1;
strcpy( str, DiskTypeMsgTbl[disktype] );
putmessage();
flagerr = 0;
/* マスタ- ディスク 読み込み */
if ( ReadDiskAll( FD0_DRVNO, DiskData, disktype ) == 0 ) {
break;
}
}
}
/* ディスク コピー */
if ( option & 2 ) {
flagerr = 1;
strcpy( str, " デ-タファイルを作成します" );
putmessage();
flagerr = 0;
if ( select() == 1 ) {
flagerr = 1;
strcpy( str, EndMsg );
putmessage();
flagerr = 0;
ready();
return;
}
if ( savedata( DiskData, disktype ) == 0 ) {
flagerr = 1;
strcpy( str, " デ-タファイルを作成しました" );
putmessage();
flagerr = 0;
ready();
strcpy( str, EndMsg );
putmessage();
ready();
}
else {
flagerr = 1;
strcpy( str, " デ-タファイルの作成に失敗しました" );
putmessage();
flagerr = 0;
strcpy( str, EndMsg );
putmessage();
ready();
}
return ;
}
else {
if ( option & 1 )
drvno = FD0_DRVNO; /* A ドライブ 設定 */
else
drvno = FD1_DRVNO; /* B ドライブ 設定 */
for ( ;; ) {
/* ディスク セット メッセージ 表示 */
strcpy( str, (drvno == FD0_DRVNO ? InCpyAMsg : InCpyBMsg) );
putmessage();
if ( select() == 1 ) {
flagerr = 1;
strcpy( str, EndMsg );
putmessage();
if ( select() == -1 ) {
return;
}
continue;
}
flagerr = 0;
/* シリンダ 0 シ-ク & リセット */
if ( DKB_restore( drvno ) != 0 ) {
ErrMsgPutWord( ERRNOTDISK ); /* ドライブ ノット レディー */
flagerr = 1;
continue;
}
/* モード 設定 */
if ( SetDiskDrvMode( drvno, disktype ) != 0 ) {
ErrMsgPutWord( ERRMODESET ); /* モード セット エラー */
flagerr = 1;
continue;
}
if ( option & 8 ) {
if ( option & 4 )
i = 0;
else
i = 2;
}
else {
if ( option & 4 )
i = 1;
else
i = 0;
}
switch ( i ) {
case 0:
/* フォーマット 実行確認表示 */
strcpy( str, FormProcMsg );
putmessage();
if ( select() != 1 ) {
FormatFlg = TRUE; /* フォーマット 実行 */
clrmessage();
flagerr = 1;
strcpy( str, "フォーマット&コピー中" );
putmessage();
flagerr = 0;
break;
}
else
/* case 1: へ*/
case 1:
FormatFlg = FALSE; /* フォーマット スキップ */
clrmessage();
flagerr = 1;
strcpy( str, "コピー中" );
putmessage();
flagerr = 0;
break;
case 2:
default:
FormatFlg = TRUE; /* フォーマット 実行 */
clrmessage();
flagerr = 1;
strcpy( str, "フォーマット&コピー中" );
putmessage();
flagerr = 0;
break;
}
/* ディスク 書き込み */
if ( WriteDiskAll( drvno, DiskData, disktype ) != 0 ) {
flagerr = 1;
continue;
}
/* A ←→ B 変換 */
drvno = ( drvno == FD0_DRVNO ? FD1_DRVNO : FD0_DRVNO );
}
}
}
/************************************************************************
【ディスクモード設定】
概要 ディスク ドライブ モード の設定を行う。
用法 SetDiskDrvMode( devno, sw );
引数 int devno : デバイス 番号
int sw : TYPE_2HD_12
: TYPE_2DD_720
: TYPE_2DD_640
: TYPE_2HC_12
戻り値 int 0x0000 : 正常終了
0x0002 : デバイス 番号 エラー
0x8??? : ハード エラー
NG : その他の エラー
注意 無し
************************************************************************/
int SetDiskDrvMode( int devno, int sw )
{
uint mode1, /* モード 1 */
mode2; /* モード 2 */
/* モ-ド 設定 */
switch ( sw ) {
case TYPE_2HD_12: /* 2HD 1.2M */
mode1 = MODE1_12; /* MFM 2HD 1024 */
mode2 = MODE2_12; /* 2 ヘッド 8 セクタ */
break;
case TYPE_2DD_720: /* 2DD 720K */
mode1 = MODE1_720; /* MFM 2DD 512 */
mode2 = MODE2_720; /* 2 ヘッド 9 セクタ */
break;
case TYPE_2DD_640: /* 2DD 640K */
mode1 = MODE1_640; /* MFM 2DD 512 */
mode2 = MODE2_640; /* 2 ヘッド 8 セクタ */
break;
case TYPE_2HC_12: /* 2HC 1.2M */
mode1 = MODE1_12C; /* MFM 2HD 512 */
mode2 = MODE2_12C; /* 2 ヘッド 15 セクタ */
break;
default:
return NG;
}
return DKB_setmode( devno, mode1, mode2 );
}
/************************************************************************
【ディスク読み込み】
概要 ディスク の 全 トラック (シリンダ) 分の 読み込みを行う。
用法 ReadDiskAll( devno, buf, sw );
引数 int devno : デバイス 番号
char *buf : 読み込み バッファ ポインタ
int sw : TYPE_2HD_12
: TYPE_2DD_720
: TYPE_2DD_640
: TYPE_2HC_12
戻り値 int 0x0000 : 正常終了
0x0002 : デバイス 番号 エラー
0x8??? : ハード エラー
NG : その他の エラー
注意 無し
************************************************************************/
int ReadDiskAll( int devno, char *buf, int sw )
{
int cylno, /* 読み込み シリンダ 番号 */
headno, /* 読み込み ヘッド 番号 */
seccnt, /* 読み込み セクタ 数 */
secnum, /* 残り セクタ 数 */
maxcylinder, /* シリンダ 最大数 */
sectorlen, /* セクタ 長 */
retry, /* エラー リトライ カウンタ */
ret; /* 戻り値 */
uint offset = 0; /* 読み込み ポインタ オフセット */
/* セクタ 数, セクタ レングス, シリンダ 数, 設定 */
switch ( sw ) {
case TYPE_2HD_12: /* 2HD 1.2M */
seccnt = MAXSEC_12;
maxcylinder = MAXCYL_2HD;
sectorlen = SECLEN1024;
break;
case TYPE_2DD_720: /* 2DD 720K */
seccnt = MAXSEC_720;
maxcylinder = MAXCYL_2DD;
sectorlen = SECLEN512;
break;
case TYPE_2DD_640: /* 2DD 640K */
seccnt = MAXSEC_640;
maxcylinder = MAXCYL_2DD;
sectorlen = SECLEN512;
break;
case TYPE_2HC_12: /* 2HC 1.2M */
seccnt = MAXSEC_12C;
maxcylinder = MAXCYL_2HC;
sectorlen = SECLEN512;
break;
default:
return NG;
}
for ( cylno = 0; cylno < maxcylinder; cylno++ ) {
retry = 0;
for ( headno = 0; headno < MAXHEAD; ) {
/* ディスク データ 読み込み */
if ( ( ret = DKB_read( devno, cylno, headno, 1,
seccnt, buf + offset, &secnum ) ) != 0 ) {
if ( retry < RETRYMAX ) { /* エラー リトライ */
retry++;
continue;
}
else {
ErrMsgPutWord( ERRDISKREAD ); /* ディスク リード エラー */
return ret;
}
}
else {
headno++;
offset += sectorlen * seccnt;
retry = 0;
}
}
}
return 0;
}
/************************************************************************
【ディスク書き込み】
概要 ディスク の 全 トラック (シリンダ) 分の 書き込みを行う。
用法 WriteDiskAll( devno, buf, sw );
引数 int devno : デバイス 番号
char *buf : 書き込み バッファ ポインタ
int sw : TYPE_2HD_12
: TYPE_2DD_720
: TYPE_2DD_640
: TYPE_2HC_12
戻り値 int 0x0000 : 正常終了
0x0002 : デバイス 番号 エラー
0x8??? : ハード エラー
NG : その他の エラー
注意 無し
************************************************************************/
int WriteDiskAll( int devno, char *buf, int sw )
{
int cylno, /* 書き込み シリンダ 番号 */
headno, /* 書き込み ヘッド 番号 */
seccnt, /* 書き込み セクタ 数 */
secnum, /* 残り セクタ 数 */
maxcylinder, /* シリンダ 最大数 */
sectorlen, /* セクタ 長 */
retry, /* エラー リトライ カウンタ */
ret; /* 戻り値 */
uint offset = 0; /* 書き込み ポインタ オフセット */
/* セクタ 数, セクタ レングス, シリンダ 数, 設定 */
switch ( sw ) {
case TYPE_2HD_12: /* 2HD 1.2M */
seccnt = MAXSEC_12;
maxcylinder = MAXCYL_2HD;
sectorlen = SECLEN1024;
break;
case TYPE_2DD_720: /* 2DD 720K */
seccnt = MAXSEC_720;
maxcylinder = MAXCYL_2DD;
sectorlen = SECLEN512;
break;
case TYPE_2DD_640: /* 2DD 640K */
seccnt = MAXSEC_640;
maxcylinder = MAXCYL_2DD;
sectorlen = SECLEN512;
break;
case TYPE_2HC_12: /* 2HC 1.2M */
seccnt = MAXSEC_12C;
maxcylinder = MAXCYL_2HC;
sectorlen = SECLEN512;
break;
default:
return NG;
}
for ( cylno = 0; cylno < maxcylinder; cylno++ ) {
retry = 0;
for ( headno = 0; headno < MAXHEAD; ) {
if ( FormatFlg == TRUE ) {
/* フォーマット データ 作成 */
MakeFormData( cylno, headno, sw );
/* トラック フォーマット */
if ( ( ret = TrackFormat( devno, cylno, headno ) ) != 0 ) {
if ( ret & 0x02 ) {
ErrMsgPutWord( ERRPROTECT ); /* 書き込み禁止 */
return ret;
}
else if ( ret & 0x01 ) {
ErrMsgPutWord( ERRNOTDISK ); /* ドライブ ノット レディー */
return ret;
}
else {
if ( retry < RETRYMAX ) { /* エラー リトライ */
retry++;
continue;
}
else {
ErrMsgPutWord( ERRFORMAT ); /* フォ-マット エラ- */
return ret;
}
}
}
}
/* データ ディスク 書き込み */
if ( ( ret = DKB_write( devno, cylno, headno, 1,
seccnt, buf + offset, &secnum ) ) != 0 ) {
if ( ret & 0x02 ) {
ErrMsgPutWord( ERRPROTECT ); /* 書き込み禁止 */
return ret;
}
else if ( ret & 0x01 ) {
ErrMsgPutWord( ERRNOTDISK ); /* ドライブ ノット レディー */
return ret;
}
else {
if ( retry < RETRYMAX ) { /* エラー リトライ */
retry++;
continue;
}
else {
ErrMsgPutWord( ERRDISKWRITE ); /* ディスク ライト エラー */
return ret;
}
}
}
else {
headno++;
offset += sectorlen * seccnt;
retry = 0;
}
}
}
return 0;
}
/************************************************************************
【1トラックフォーマット】
概要 ディスク の 1 トラック (シリンダ) 分の フォーマット を行う。
用法 TrackFormat( devno, cylno, headno );
引数 int devno : デバイス 番号
int cylno : シリンダ 番号
int headno : ヘッド 番号
戻り値 int 0x0000 : 正常終了
0x0002 : デバイス 番号 エラー
0x8??? : ハード エラー
注意 フォ-マット データ は FormDataBuf を使用する
************************************************************************/
int TrackFormat( int devno, int cylno, int headno )
{
union REGS regs;
struct SREGS sregs;
ushort dsdata;
IntParaBlk parablk;
/* debug *******************************
return (DKB_format( devno, cylno, headno, FormDataBuf ));
/***************************************/
/* セグメント データ 読み込み */
_segread( &sregs );
dsdata = sregs.ds;
/* 共用 バッファ アドレス 取得 DOS-Extender ファンクション */
regs.x.ax = 0x250d;
_int86x( 0x21, ®s, ®s, &sregs );
/* フォーマット データ バッファ から 共用 バッファ へ データ コピー */
_movedata( (uint)dsdata, (uint)FormDataBuf,
(uint)sregs.es, regs.x.dx, sizeof(FormDataBuf) );
/* フォーマット ファンクション を DOS-Extender を介して発行 */
parablk.intno = 0x93; /* 割り込み番号 */
parablk.reax = (uint)(0x0a00 | devno); /* BIOS ファンクション 番号 & デバイス 番号 */
regs.x.cx = (uint)cylno; /* シリンダ 番号 */
parablk.redx = (uint)(headno << 8); /* ヘッド 番号 */
parablk.rds = (ushort)(regs.x.bx >> 16); /* 共用 バッファ リアル セグメント */
regs.x.di = regs.x.bx & 0xffff; /* 共用 バッファ リアル オフセット */
parablk.res = 0; /* 未使用 */
parablk.rfs = 0;
parablk.rgs = 0;
regs.x.ax = 0x2511; /* リアル モード 割り込み発行 */
regs.x.dx = (uint)¶blk; /* パラメータ ブロック オフセット */
sregs.ds = sregs.ss; /* パラメータ ブロック セグメント */
_intdosx( ®s, ®s, &sregs ); /* int 21h ax = 2511h 実行 */
if ( regs.h.ah <= 0x02 )
return (int)(regs.h.ah);
else
return (int)( (regs.x.cx | 0x8000) & 0xffff );
}
/************************************************************************
【フォーマットデータ作成】
概要 1 トラック (シリンダ) 分の フォーマット データ 作成を行う。
用法 MakeFormData( cylno, headno, sw );
引数 int cylno : シリンダ 番号
int headno : ヘッド 番号
int sw : TYPE_2HD_12
: TYPE_2DD_720
: TYPE_2DD_640
: TYPE_2HC_12
戻り値 無し
注意 フォ-マット データ は FormDataBuf を使用する
************************************************************************/
void MakeFormData( int cylno, int headno, int sw )
{
int i;
int secnum,
secmax;
char *p;
FORMPARA *secdata;
/* 作成 セクタ 数 & セクタ 圧縮 データ 設定 */
switch ( sw ) {
case TYPE_2DD_640: /* 2DD 640K */
secmax = MAXSEC_640;
secdata = SecData512;
break;
case TYPE_2DD_720: /* 2DD 720K */
secmax = MAXSEC_720;
secdata = SecData512;
break;
case TYPE_2HC_12: /* 2HC 1.2M */
secmax = MAXSEC_12C;
secdata = SecData512;
break;
case TYPE_2HD_12: /* 2HD 1.2M */
default:
secmax = MAXSEC_12;
secdata = SecData1024;
break;
}
p = FormDataBuf;
/* プレ アンブル データ 展開 */
for ( i = 0; i < PreAmblCnt; i++ ) {
memset( p, PreAmbl[i].fdata, PreAmbl[i].cnt );
p += PreAmbl[i].cnt;
}
/* セクタ データ 展開 */
secdata[3].fdata = cylno; /* ID TRACK NUMBER */
secdata[4].fdata = headno; /* ID SIDE NUMBER */
for ( secnum = 0; secnum < secmax; secnum++ ) {
secdata[5].fdata = secnum + 1; /* ID SECTOR NUMBER */
for ( i = 0; i < SecData1024Cnt; i++ ) {
memset( p, secdata[i].fdata, secdata[i].cnt );
p += secdata[i].cnt;
}
}
/* ポスト アンブル データ 展開 */
memset( p, PosAmbl[0].fdata, PosAmbl[0].cnt );
}
/************************************************************************
【フォーマットタイプチェック】
概要 ディスク の フォ-マット タイプ を調べる。
用法 ChkFormatType( devno );
引数 int devno : デバイス 番号
戻り値 int TYPE_NOT : 未対応 ディスク
TYPE_2HD_12 : 1.2M 2HD
TYPE_2DD_720 : 720K 2DD
TYPE_2DD_640 : 640K 2DD
TYPE_2HC_12 : 1.2M 2HC
NG : ディスク エラー
注意 シリンダ 2, ヘッド 0 の フォーマット チェック
セクタ ID を読みだして タイプ を決定する
************************************************************************/
int ChkFormatType( int devno )
{
DKB_SEC secid[30];
uint mode1tmp,
mode2tmp,
cnt;
int flg,
ret;
/* シリンダ 0 シ-ク & リセット */
if ( DKB_restore( devno ) != 0 )
return NG;
/* シリンダ 2 シ-ク */
if ( DKB_seek( devno, 2 ) != 0 )
return NG;
flg = FALSE; /* フラグ クリア */
for ( cnt = 0; cnt < ChkMode1Tbl_Size; cnt++ ) {
/* ドライブ モード 仮設定 */
DKB_setmode( devno, ChkMode1Tbl[cnt], 0x0208 );
/* セクタ ID 取り出し */
if ( ( ret = DKB_rdsecid( devno, 2, 0, &secid[0] ) ) == 0 ) {
flg = TRUE;
break; /* 正常終了なら ループ 脱出 */
}
else if ( ret & 0x0003 ) {
return NG; /* ドライブ 異常終了 */
}
}
/* 処理 フラグ チェック */
if ( flg == FALSE )
return NG; /* セクタ ID 無し */
/* ドライブ モード 取り出し */
DKB_rdmode( devno, &mode1tmp, &mode2tmp );
/* 30 セクタ 分の ID を 読む */
for ( cnt = 0; cnt < 30; cnt++ ) {
if ( DKB_rdsecid( devno, 2, 0, &secid[cnt] ) != 0 )
return NG;
}
/* セクタ 数の チェック */
flg = FALSE; /* フラグ クリア */
for ( cnt = 1; cnt < 30; cnt++ ) {
if ( secid[0].secno == secid[cnt].secno ) {
flg = TRUE;
break; /* 正常終了なら ループ 脱出 */
}
}
/* 処理 フラグ チェック */
if ( flg == FALSE )
return NG; /* セクタ 異常 */
/* mode 1 作成 */
mode1tmp &= 0xfc;
mode1tmp |= (uint)(secid[0].seccnt);
/* mode 2 作成 */
mode2tmp &= 0xff00;
mode2tmp |= cnt;
/* フォーマット タイプ 選別 */
if ( mode1tmp == MODE1_12 && mode2tmp == MODE2_12 ) {
return TYPE_2HD_12; /* 1.2M 2HD */
}
else if ( mode1tmp == MODE1_720 && mode2tmp == MODE2_720 ) {
return TYPE_2DD_720; /* 720K 2DD */
}
else if ( mode1tmp == MODE1_640 && mode2tmp == MODE2_640 ) {
return TYPE_2DD_640; /* 640K 2DD */
}
else if ( mode1tmp == MODE1_12C && mode2tmp == MODE2_12C ) {
return TYPE_2HC_12; /* 1.2M 2HC */
}
return TYPE_NOT; /* 未対応 ディスク */
}
/* end of file */